'use strict';

module.exports = (option, app) => {
  // 中间件的配置项，框架会将 app.config[${middlewareName}] 传递进来
  return async function (ctx, next) {
    try {
      await next();
    } catch (err) {
      // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
      app.emit('error', err, this);
      let status = err.status || 500;
      // 生产环境时 500 错误的详细错误内容不返回给客户端，因为可能包含敏感信息
      // 从 error 对象上读出各个属性，设置到响应中
      ctx.body = {};
      ctx.body.status = "failed";
      ctx.body.error_code = err.code;
      ctx.body.error_msg = "请求失败";
      ctx.body.success = false;


      if (err.code == 11000) {
        ctx.body.error_msg = '你已有重复的内容';
        ctx.body.detail = err.message;
        status = 200;
      } else {

      }


      ctx.status = status;
      if (status === 422) {
        ctx.body.detail = err.errors;
      }

      if (err.message && ['prod', 'pachong', 'hot'].includes(app.config.env)
        && !err.message.includes('Content-Type must be multipart/*')
        && !err.message.includes('waiting for selector `#content_left > div')
      ) {
        await ctx.helper.dd_warn(err.message);
      }
    }
  };
};
